package com.example.dakotanews.service;

import com.example.dakotanews.dto.NewsEditFormDTO;
import com.example.dakotanews.dto.utils.ApiResponse;
import org.springframework.stereotype.Service;

@Service
public interface NewsService {

    /**
     * @description 获取新闻信息包括新闻本体信息、新闻作者信息、新闻所属话题信息并将其包装成统一响应体返回
     * @param newsId 新闻ID
     * @param userId 查看新闻的用户ID
     * @return 新闻本体信息、新闻作者信息、新闻所属话题信息、访客用户操作标识信息
     */
    ApiResponse<Object> getNewsAllInfo(Integer newsId, Integer userId);

    /**
     * @description 点赞操作
     * @param newsId 新闻ID，下二同
     * @param userId 查看新闻的用户ID，下二同
     * @return 操作结果，下二同
     */
    ApiResponse<Object> supportNews(Integer newsId, Integer userId);

    /**
     * @description 点踩操作
     */
    ApiResponse<Object> oppositeNews(Integer newsId, Integer userId);

    /**
     * @description 收藏操作
     */
    ApiResponse<Object> collectNews(Integer newsId, Integer userId);

    /**
     * @description 获取新闻分类列表
     * @return 返回新闻分类（包含分类ID和分类名）的List集合
     */
    ApiResponse<Object> getNewsSort();

    /**
     * @description 一般推荐方法。查询对应分类的新闻并根据一般算法对其进行排序
     * @param newsSort 新闻分类，根据分类表查询对应分类。0 代表不分类
     * @return 有序的简单新闻信息DTO的List集合
     */
    ApiResponse<Object> commonRecommend(Integer newsSort, int page, int pageSize);

    /**
     * @description 个性化推荐方法。查询对应分类的新闻并结合用户信息根据个性化算法对其进行排序
     * @param newsSort 新闻分类
     * @param userId 访客用户ID
     * @return 有序的简单新闻信息DTO的List集合
     */
    ApiResponse<Object> personalizedRecommend(Integer newsSort, Integer userId, int page, int pageSize);

    /**
     * @description 获取新闻编辑表单数据
     * @param newsId （必选）待编辑的新闻ID
     * @param userId （必选）操作用户ID
     * @return 新闻修改表单DTO
     */
    ApiResponse<Object> getNewsEditForm(Integer newsId, Integer userId);

    /**
     * @description 新增新闻记录
     * @param newsEditFormDTO 新闻内容
     * @param userId 标明新闻作者
     * @return 返回新增记录的ID
     */
    ApiResponse<Object> addNews(NewsEditFormDTO newsEditFormDTO, Integer userId);

    /**
     * @description 修改新闻记录
     * @param newsEditFormDTO 修改的内容
     * @param newsId 标明修改的是哪篇新闻
     * @return 返回修改记录的ID
     */
    ApiResponse<Object> editNews(NewsEditFormDTO newsEditFormDTO, Integer newsId);
}
